package service;

import dao.CursoDAO;
import dao.CursoDisciplinaDAO;
import excecao.CursoPossuiDisciplinasException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.Curso;
import modelo.CursoDisciplina;
import util.FabricaDeObjetos;
import util.JPAUtil;

/**
 *
 * @author Abraao
 */
public class CursoService {

    private static CursoDAO cursoDAO;
    private static CursoDisciplinaDAO cursoDisciplinaDAO;

    static {
        try {
            cursoDAO = (CursoDAO) FabricaDeObjetos.getObjetoUnico(CursoDAO.class);
            cursoDisciplinaDAO = (CursoDisciplinaDAO) FabricaDeObjetos.getObjetoUnico(CursoDisciplinaDAO.class);
        } catch (Exception ex) {
            Logger.getLogger(CursoService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<Curso> getTodos() {
        return cursoDAO.getAll();
    }

    public Curso getPorId(Long id) {
        return cursoDAO.getPorId(id);
    }

    public List<Curso> getPorNome(String nome) {
        return cursoDAO.getPorNome(nome);
    }

    public void inserir(Curso curso) {
        JPAUtil.beginTransaction();

        cursoDAO.persist(curso);
        
        JPAUtil.commitTransaction();
    }

    public void remover(Curso curso) throws CursoPossuiDisciplinasException {
        JPAUtil.beginTransaction();
        Curso curso1 = cursoDAO.getPorId(curso.getId());
        List<CursoDisciplina> listaAlunoDisciplina = cursoDisciplinaDAO.getPorCurso(curso1);

        if (listaAlunoDisciplina != null && !listaAlunoDisciplina.isEmpty()) {
            throw new CursoPossuiDisciplinasException("O curso possui disciplinas cadastradas!");
        }
        cursoDAO.remove(curso1);

        JPAUtil.commitTransaction();
    }

    public void alterar(Curso cursoMod) throws CursoPossuiDisciplinasException {
        JPAUtil.beginTransaction();
        List<CursoDisciplina> listaAlunoDisciplina = cursoDisciplinaDAO.getPorCurso(cursoMod);

        if (listaAlunoDisciplina != null && !listaAlunoDisciplina.isEmpty()) {
            throw new CursoPossuiDisciplinasException("O curso possui disciplinas cadastradas!");
        }
        cursoDAO.merge(cursoMod);

        JPAUtil.commitTransaction();
    }

    public Curso getPorIdComDisciplinas(Long id) {
        return cursoDAO.getPorIdComDisciplinas(id);
    }
}
